package is1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;



 /**
  * 
  * @author Abel_Administrador
  *	Implementacion de Catalogo para fuente CVS en internet
  */
public class CatalogoCVS extends Catalogo 
{
	
	URL url;
	URLConnection urlConn;
	InputStreamReader  inStream;
	BufferedReader buff;
	int tamBuffCache;	//bytes leidos de la cache, no confundir con tamCache
	/**
	 * 
	 * @param source Origen de datos
	 */
	public CatalogoCVS(String source)
	{
		super(source);
	
	
		url = null;
		urlConn = null;
		inStream = null;
		buff = null;
		tamBuffCache= 0;
	}
	
	/**
	 * 	Devuelve un producto del origen de datos de dicho codigo,
	 * null si no existe.
	 * @param codProducto Codigo del producto buscado
	 */
	@Override
	public Producto getProducto(String codProducto)
	{

		Producto buscado = null;
		String nextLine = null;
		String[] datosProducto = null;
		
		String cod = "Ref. " + codProducto + " ";
		//Buscamos en memoria local
		for(Producto p : productos)
		{
			if(p.getCodigo().equals(cod))
			{
				buscado = p;
				break;
			}
		}
		//Buscamos en el servidor
		if(buscado == null)
		{
			
		
			try 
			{
				url  = new URL(source);
				urlConn = url.openConnection();
				inStream = new InputStreamReader(urlConn.getInputStream());
				buff= new BufferedReader(inStream);
				//System.out.println(tamBuffCache);
				buff.skip(tamBuffCache);
		 
				nextLine = buff.readLine(); //Lectura avanzada
				while(nextLine != null)
				{
			    	datosProducto = nextLine.split(";");
			    	 
			    	if(datosProducto[0].equals(cod))
			    	{
			    		try
			    		{
			    			productos.add(new Producto(datosProducto[1], datosProducto[0], Float.valueOf(datosProducto[2])));
			    		}
			    		catch (NumberFormatException ex)
				    	{
				    		String precio = datosProducto[2];
				    		int puntoValido = precio.lastIndexOf('.');
				    		int index = precio.indexOf('.');
				    		
				    		while (index != puntoValido)
				    		{
				    			precio = precio.replaceFirst("[.]", "");
				    			index = precio.indexOf('.');
				    			puntoValido = precio.lastIndexOf('.');
				    		}
				    		
				    		productos.add(new Producto(datosProducto[1], datosProducto[0], Float.valueOf(precio)));
				    	}
			    		
			    		buscado = productos.get(productos.size()-1);
			    		break;
			    	}
			    	nextLine = buff.readLine();
				}
				//buff.reset();	//Volvemos al inicio
			}
			catch(MalformedURLException e)
			{
			 	System.out.println("No se puede conectar con la URL");
			}
			catch (IOException e) 
			{

				System.out.println("No hay conexión con internet" );
				e.printStackTrace();
			}
		}
		
		return buscado;
		
	}
	
	/**
	 * Caraga los datos en funcion de la cache de datos
	 */
	@Override
	public void cargarDatos()
	{
		String nextLine = "";
		String[] datosProducto = null;
		//Realizamos conexion
		try
		{
		
			url  = new URL(source);
		    urlConn = url.openConnection();
		    inStream = new InputStreamReader(urlConn.getInputStream());
		    buff= new BufferedReader(inStream);
		    //Lectura preliminar para la linea que no sirve de nada
		    nextLine = buff.readLine();  
		    tamBuffCache+= nextLine.length();
		    // Read and print the lines from index.html
		    for(int i = 0; i < tamCache && nextLine != null;i++)
		    {
		    	nextLine = buff.readLine();
		    	datosProducto = nextLine.split(";");
		    	try
		    	{
		    		productos.add(new Producto(datosProducto[1], datosProducto[0], Float.valueOf(datosProducto[2])));
		    	}
		    	catch (NumberFormatException ex)
		    	{
		    		String precio = datosProducto[2];
		    		int puntoValido = precio.lastIndexOf('.');
		    		int index = precio.indexOf('.');
		    		
		    		while (index != puntoValido)
		    		{
		    			precio = precio.replaceFirst("[.]", "");
		    			index = precio.indexOf('.');
		    			puntoValido = precio.lastIndexOf('.');
		    		}
		    		
		    		productos.add(new Producto(datosProducto[1], datosProducto[0], Float.valueOf(precio)));
		    	}
		    	tamBuffCache+= nextLine.length();
		    	
			}
		    //Marcamos despues de lo leido para hacer reset a este punto
		    //buff.mark(nextLine.length());
		    buff.close();
		}
		catch(MalformedURLException e)
		{
		 	System.out.println("No se puede conectar con la URL");
		} 
		catch(IOException  e1)
		{
			System.out.println("No hay conexión con internet" ); 
		}
		
	}
	public static void main(String[] args) throws ExcepcionTPV 
	{
		Catalogo c = new CatalogoCVS("http://www.dlsi.ua.es/~ccachero/catalogo.csv");
		c.setTamCache(5);
		c.cargarDatos();
		
		System.out.println(c.getProducto("Ref. 001668 "));//En memoria
		System.out.println(c.getProducto("Ref. 008887 ")); //En el servidor
		System.out.println(c.getProducto("Ref. 002051 ")); //En el servidor
		System.out.println(c.getProducto("Ref. 11 ")); //no existe
		
	}

	 

	
}


